import random
import string

from django.shortcuts import render
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet,ModelViewSet
from .serializer import *
from .models import *
from rest_framework.permissions import IsAuthenticated  #集中权限管理 简便，登陆即可获得全部权限
from utils.permission import TeacherPermission  #导入自定义权限
from rest_framework.status import HTTP_404_NOT_FOUND,HTTP_201_CREATED
from django.contrib.auth.models import Group
from celery_tasks.email.tasks import send_email_task

# Create your views here.

class ClassesViewSet(ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False) #接口操作的所有数据，除了is_delete都显示
    serializer_class = ClassesSerializers
    # permission_classes = [IsAuthenticated]  #班级权限 (集中权限管理)
    permission_classes = [TeacherPermission]  #班级权限 (自定义权限管理)

    def get_serializer(self,*args,**kwargs): #重写get_serializer，根据不同的操作显示不同的序列化器
        if self.action == 'students':  #如果状态为学生student，则返回添加学生的序列器，否则返回添加班级的序列器
            return CreateUserSerializer(*args,**kwargs)
        return ClassesSerializers(*args,**kwargs)


    #要增加一个功能，需要用装饰器
    @action(methods=['post'],detail=True)
    def students(self,request,pk):
        #获取班级
        try:
            classes = self.get_queryset().get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        #得到前端传入的数据
        username = request.data['username']
        email = request.data['email']
        first_name = request.data['first_name']
        #判断该用户是否在该班级，查询班级所有成员，以用户作为条件
        member = classes.member.filter(username=username) #有则查询出这条用户出来 #member是多对多的关联查询
        #如果在，则返回提示已存在
        if member:
            return Response({'msg':'该成员已经加入该班级'})
        #如果不在，则判断用户是否存在，判断是否是新学员
        user= User.objects.filter(username=username) #filter返回查询集合(多条数据)，get返回具体的数据对象(但只有一条数据)
        if user: #如果有此用户(则是老用户)
            user = user.first()
            #如果存在该用户，则添加到新班级，并且返回
            classes.member.add(user)
            return Response(self.get_serializer(user).data) #返回用户序列化的数据
        #如果是新学员，使用序列化器进行反序列化(把前端传过来的数据转为模型数据，保存到数据库)
        user_serializer = self.get_serializer(data=request.data) #进行反序列化，把传过来的新用户数据转为模型类数据
        user_serializer.is_valid(raise_exception=True) #如果有问题返回异常
        user = User(username=username,first_name=first_name,email=email) #没问题就创建用户
        #生成初始密码
        source = string.ascii_letters +string.digits
        password = ''.join(random.sample(source,6))
        user.set_password(password) #给用户设置密码，并自动加密，存储密文
        user.save()
        #发送邮件
        # print(email,username,first_name,classes.name)
        #设置成学生身份
        group = Group.objects.get(id=2)
        group.user_set.add(user) #给学生组添加用户，反向访问
        #添加到对应班级
        classes.member.add(user)
        #生成邮件发送异步任务
        send_email_task.delay(email,username,password,classes.name)
        #返回
        return Response(user_serializer.data,status=HTTP_201_CREATED)

